#ifndef PARSER_INC
#define PARSER_INC

#include "Dictionary.h"
#include <cctype>

/*-----------------------------------------------------------------------------
 *  Tamanho mínimo de leitura no disco
 *-----------------------------------------------------------------------------*/
#define READ_SIZE   4096

/*
 * =====================================================================================
 *        Class:  Parser
 *  Description:  Classe que representa o Parser que lerá o arquivo de entrada
 * =====================================================================================
 */
class Parser
{

public:

    /*-----------------------------------------------------------------------------
     *  Contrói um Parser
     *-----------------------------------------------------------------------------*/
    Parser(const string &filename);

    /*-----------------------------------------------------------------------------
     *  Lê um caracter
     *-----------------------------------------------------------------------------*/
    char read();

    /*-----------------------------------------------------------------------------
     *  Realiza o parseamento
     *-----------------------------------------------------------------------------*/
    Dictionary& parse();

    /*-----------------------------------------------------------------------------
     *  Retorna as palavras encontradas
     *-----------------------------------------------------------------------------*/
    Dictionary& getDictionary();

private:

    /*-----------------------------------------------------------------------------
     *  Verifica se determinado caracter c é separador
     *-----------------------------------------------------------------------------*/
    inline bool isseparator(char c);

    /*-----------------------------------------------------------------------------
     *  Estados do parser
     *-----------------------------------------------------------------------------*/
    enum { SKIP_BEFORE, APPEND_CHAR, SKIP_AFTER, SKIP_WORD };

    /*-----------------------------------------------------------------------------
     *  Stream de entrada
     *-----------------------------------------------------------------------------*/
    ifstream ifs;

    /*-----------------------------------------------------------------------------
     *  Buffer de entrada
     *-----------------------------------------------------------------------------*/
    char buffer[READ_SIZE];

    /*-----------------------------------------------------------------------------
     *  Tamanho do buffer
     *-----------------------------------------------------------------------------*/
    uint bsize;

    /*-----------------------------------------------------------------------------
     *  Ponteiro para o buffer
     *-----------------------------------------------------------------------------*/
    uint bpointer;

    /*-----------------------------------------------------------------------------
     *  Palavras encontradas no arquivo
     *-----------------------------------------------------------------------------*/
    Dictionary dict;

};

#endif
